﻿

//using System;
//using System.Collections.Generic;
//using System.Diagnostics;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;
////class Program
////{
////    //---------------------------------------------- C#中 返回值前面加ref
////    static void Main(string[] args)
////    {

////        var calculator = new DistanceCalculator();
////        // 调用 GetEstimatedDistance 方法，并将返回值与 calculator 中 estDistance 变量绑定在一起
////        ref double estimatedDistance = ref calculator.GetEstimatedDistance();

////        Console.WriteLine($"初始估计距离：{estimatedDistance}");

////        // 修改返回的值，实际上也会修改 calculator 中 estDistance 变量的值
////        estimatedDistance = 15.0;

////        Console.WriteLine($"修改后的估计距离：{estimatedDistance}");
////        Console.WriteLine($"实际距离：{calculator.EstDistance}");
////    }
////}

////class DistanceCalculator
////{
////    private double estDistance = 0.0;

////    public ref double GetEstimatedDistance()
////    {
////        return ref estDistance;
////    }
////	public double EstDistance { get => this.estDistance; }
////}

////----------------------------------------------C#使用 Async 和 Await 的异步编程
////https://blog.csdn.net/qq_39847278/article/details/128244590


//////    异步这个概念在不同语境下有不同的解释，比如在一个单核CPU里开启两个线程执行两个函数，通常认为这种调用是异步的，但对于CPU来说它是单核不可能同时运行两个函数，不过是由系统调度在不同的时间分片中执行。一般来说，如果两个工作能同时进行，就认为是异步的。在编程中，它通常代表函数的调用可以在不执行完的情况下返回，必要时在完成时回调。

//////有一个概念常常被混淆，多线程和异步。很多人认为异步就是多线程的，但是多线程只是实现异步的其中一种方式，除此之外还有系统中断，定时器，甚至可以自己写一个状态机实现异步（C# 的异步实现类似状态机）。

//////不同的编程语言有不同异步编程方法，在C#语言中，常常使用async/await等关键字，和Task等类来实现异步编程。
////class Program
////    {
////        static void Main(string[] args)
////        {
////            var task = IntTask();
////            Console.WriteLine("等待中...");
////            Console.WriteLine($"算完了？ 让我康康！ result = {task.Result}");
////        }

//////用async修饰一个方法，表明这个方法可以异步执行，其返回值必须是void/Task/Task<T>（T是返回值类型）其中一个，
//////方法内的语句至少包含一个await关键字，否则会被同步的方式执行。
////        static async Task<int> IntTask()
////        {
////            Console.WriteLine("等3秒吧");
////  //      await只能修饰（返回值是）Task类型变量，此时会返回Task.Result或void而不是Task本身，
////		//在上述示例中，Main没有被async修饰，不能使用await，其返回值就是Task<int>, 
////		//而IntTask调用Task.Delay就是直接返回void。await也只能在被async修饰的函数的语句中使用。
////            await Task.Delay(3000);
////            return 1;
////        }
////    }
////public class program
////{
////    static void Main(string[] args)
////    {
////        // 一个人倒橙汁 倒咖啡  // 另外三个人同时烤面包，煎培根，煎鸡蛋
////        MakeBreakFest();
////        Console.ReadKey();
////    }

////    private static async void MakeBreakFest()
////    {

////        Console.OutputEncoding = System.Text.Encoding.Unicode;
////        Stopwatch stopwatch = new Stopwatch();
////        stopwatch.Start();

////        // 一个人倒橙汁 倒咖啡  // 另外三个人同时烤面包，煎培根，煎鸡蛋
////        List<Task> tasks = new List<Task>() { Test1(), Test2() };

////        await Task.WhenAll(tasks);

////        Console.WriteLine("早餐已经做完!");
////        stopwatch.Stop();
////        Console.WriteLine($"做早餐总计耗时：{stopwatch.ElapsedMilliseconds}");

////    }

////    private static async Task Test1()
////    {
////        await PourOJ();
////        await PourCoffee();


////    }

////    private static async Task Test2()
////    {
////        List<Task> tasks = new List<Task>() { ToastBread(), FryBacon(), FryEggs() };
////        await Task.WhenAll(tasks);

////    }


////    //倒橙汁
////    private static async Task PourOJ()
////    {
////        await Task.Delay(1000);
////        Console.WriteLine("A 倒一杯橙汁");
////    }

////    //烤面包
////    private static async Task ToastBread()
////    {
////        Console.WriteLine("B 开始烤面包");
////        await Task.Delay(3000);
////        Console.WriteLine("B 烤面包好了");

////    }

////    //煎培根
////    private static async Task FryBacon()
////    {
////        Console.WriteLine("C 开始煎培根");
////        await Task.Delay(6000);
////        Console.WriteLine("C 培根煎好了");
////    }
////    //煎鸡蛋
////    private static async Task FryEggs()
////    {
////        Console.WriteLine("D 开始煎鸡蛋");
////        await Task.Delay(6000);
////        Console.WriteLine("D 鸡蛋好了");
////    }

////    //倒咖啡
////    private static async Task PourCoffee()
////    {
////        await Task.Delay(1000);
////        Console.WriteLine("A 倒咖啡");
////    }
////}

////class ImplicitlyTypedLocals2
////{
////    static void Main()
////    {
////        string[] words = { "aPPLE", "BlUeBeRrY", "cHeRry" };

////        // If a query produces a sequence of anonymous types,
////        // then use var in the foreach statement to access the properties.
////        var upperLowerWords =
////             from w in words
////             select new { Upper = w.ToUpper(), Lower = w.ToLower() };

////        // Execute the query
////        foreach (var ul in upperLowerWords)
////        {
////            Console.WriteLine("Uppercase: {0}, Lowercase: {1}", ul.Upper, ul.Lower);
////        }
////        Console.ReadKey();
////    }
////}
///* Outputs:
//    Uppercase: APPLE, Lowercase: apple
//    Uppercase: BLUEBERRY, Lowercase: blueberry
//    Uppercase: CHERRY, Lowercase: cherry
// */

//public class program
//{


//    public static void Main(string[] args)
//    {

//        Console.OutputEncoding = System.Text.Encoding.Unicode;
//        //在后台程线上执行异步操作
//        Task t0= Task.Run(async () =>
//        {
//            await DoSomethingAsync();
//        });
//        //Func<Task> task = DoSomethingAsync;

//        //Func<Task> task2 = async () => { await DoSomethingAsync(); };

//        //Task.Run(task2);

//        t0.Wait();


//        //Task myTask = DoSomethingAsync();
//        //Console.WriteLine("AA-Task状态-" + myTask.Status.ToString());
//        //myTask.ContinueWith((t) =>
//        //{
//        //    Console.WriteLine("CC--" + (t == myTask).ToString());
//        //    Console.WriteLine("CC-Task状态-" + t.Status.ToString());
//        //});



//        Console.WriteLine("主线程继续执行");
//        Console.ReadKey();
//    }

//    static async Task DoSomethingAsync()
//    {
//        执行一些耗时的操作
//      await Task.Delay(2000);
//        Console.WriteLine("BB-Task状态-异步操作完成");
//    }



//}

